/* * Author: Chris Seguin * * This software has been developed under the copyleft * rules of the GNU General Public License. Please * consult the GNU General Public License for more * details about use and distribution of this software. */ package org.acm.seguin.refactor.field; import java.util.Iterator; import org.acm.seguin.refactor.ComplexTransform; import org.acm.seguin.summary.FieldSummary; import org.acm.seguin.summary.FileSummary; import org.acm.seguin.summary.TraversalVisitor; import org.acm.seguin.summary.TypeDeclSummary; import org.acm.seguin.summary.TypeSummary; import org.acm.seguin.summary.query.Ancestor; import org.acm.seguin.summary.query.GetTypeSummary; /** * Removes the field from all subclasses of a particular class. * *@author Chris Seguin */ public class RemoveFieldFromSubclassVisitor extends TraversalVisitor { private FieldSummary target; private TypeSummary ancestor; private ComplexTransform complex; private TypeSummary notHere; /** * Constructor for the RemoveFieldFromSubclassVisitor object * *@param type the ancestor type *@param init the field *@param notThisOne a type to skip *@param transform Description of Parameter */ public RemoveFieldFromSubclassVisitor(TypeSummary type, FieldSummary init, TypeSummary notThisOne, ComplexTransform transform) { target = init; ancestor = type; notHere = notThisOne; complex = transform; } /** * Visits a file summary node and updates it if necessary * *@param fileSummary Description of Parameter *@param data Description of Parameter *@return Description of the Returned Value */ public Object visit(FileSummary fileSummary, Object data) { complex.clear(); super.visit(fileSummary, data); if (complex.hasAnyChanges()) { complex.apply(fileSummary.getFile(), fileSummary.getFile()); } return data; } /** * Visits a type summary and updates it * *@param typeSummary Description of Parameter *@param data Description of Parameter *@return Description of the Returned Value */ public Object visit(TypeSummary typeSummary, Object data) { if ((typeSummary != notHere) && Ancestor.query(typeSummary, ancestor)) { Iterator iter = typeSummary.getFields(); if (iter != null) { while (iter.hasNext()) { visit((FieldSummary) iter.next(), data); } } } return data; } /** * Visits the field summary and determines if it should be removed. * *@param fieldSummary Description of Parameter *@param data Description of Parameter *@return Description of the Returned Value */ public Object visit(FieldSummary fieldSummary, Object data) { if (fieldSummary.getName().equals(target.getName())) { TypeDeclSummary current = fieldSummary.getTypeDecl(); TypeDeclSummary targetDecl = target.getTypeDecl(); if (GetTypeSummary.query(current) == GetTypeSummary.query(targetDecl)) { complex.add(new RemoveFieldTransform(target.getName())); } } return data; } }